package org.alex.samples.service;

import java.util.ArrayList;
import java.util.List;

import org.alex.samples.dao.IExamSubjectDAO;
import org.alex.samples.dao.IExamTestDAO;
import org.alex.samples.dao.IExamTestTypeDAO;
import org.alex.samples.javabean.ExamSubjectVO;
import org.alex.samples.javabean.ExamTestTypeVO;
import org.alex.samples.javabean.ExamTestVO;
import org.alex.samples.model.ExamSubject;
import org.alex.samples.model.ExamTest;
import org.alex.samples.model.ExamTestType;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional
public class ExamTestServiceImpl implements IExamTestService {

	@Autowired
	private IExamTestDAO iExamTestDAO;

	@Autowired
	private IExamTestTypeDAO iExamTestTypeDAO;
	
	@Autowired
	private IExamSubjectDAO iExamSubjectDAO;

	@Override
	public List<ExamTestVO> findAll() {
		List<ExamTestVO> examTestVOs = new ArrayList<ExamTestVO>();
		List<ExamTest> examTests = iExamTestDAO.find("from ExamTest");
		for (int i = 0; i < examTests.size(); i++) {
			ExamTestVO examTestVO = new ExamTestVO();
			BeanUtils.copyProperties(examTests.get(i), examTestVO);
			examTestVOs.add(examTestVO);

			ExamSubject subject = iExamSubjectDAO.get(examTests.get(i).getSubId());
			examTestVOs.get(i).setSubName(subject.getName());

			ExamTestTypeVO examTestTypeVO = new ExamTestTypeVO();
			BeanUtils.copyProperties(examTests.get(i).getExamTestType(), examTestTypeVO);
			examTestVOs.get(i).setExamTestTypeVO(examTestTypeVO);
		}
		return examTestVOs;
	}

	@Override
	public ExamTestVO getTestById(Integer testId) {
		ExamTestVO examTestVO = new ExamTestVO();
		ExamTest examTest = iExamTestDAO.get(testId);
		ExamTestTypeVO examTestTypeVO = new ExamTestTypeVO();
		if (examTest != null) {
			BeanUtils.copyProperties(examTest.getExamTestType(), examTestTypeVO);
			BeanUtils.copyProperties(examTest, examTestVO);
			examTestVO.setExamTestTypeVO(examTestTypeVO);
		}
		return examTestVO;
	}

	@Override
	public void deleteTest(Integer testId) {
		ExamTest examTest = iExamTestDAO.get(testId);
		if (examTest != null) {
			iExamTestDAO.delete(examTest);
		}
	}

	@Override
	public List<ExamTestTypeVO> findAllExamTestType() {
		List<ExamTestTypeVO> examTestTypeVOs = new ArrayList<ExamTestTypeVO>();
		List<ExamTestType> examTestTypes = iExamTestTypeDAO.find("from ExamTestType");
		ExamTestTypeVO examTestTypeVO = null;
		for(ExamTestType examTestType: examTestTypes) {
			examTestTypeVO = new ExamTestTypeVO();
			BeanUtils.copyProperties(examTestType, examTestTypeVO);
			examTestTypeVOs.add(examTestTypeVO);
		}
		return examTestTypeVOs;
	}

	@Override
	public List<ExamSubjectVO> findAllSubject() {
		List<ExamSubject> examSubjects = iExamSubjectDAO.find("from ExamSubject");
		List<ExamSubjectVO> examSubjectVOs = new ArrayList<ExamSubjectVO>();
		ExamSubjectVO examSubjectVO = null;
		for(ExamSubject examSubject : examSubjects) {
			examSubjectVO = new ExamSubjectVO();
			BeanUtils.copyProperties(examSubject, examSubjectVO);
			examSubjectVOs.add(examSubjectVO);
		}
		return examSubjectVOs;
	}
	
	@Override
	public void updateTest(ExamTestVO examTestVO) {
		ExamTest examTest = iExamTestDAO.get(examTestVO.getId());
		ExamTestType examTestType = iExamTestTypeDAO.get(examTestVO.getExamTestTypeVO().getId());
		if (examTest != null) {
			examTest.setExamTestType(examTestType);
			BeanUtils.copyProperties(examTestVO, examTest);
			iExamTestDAO.update(examTest);
		}
	}

	@Override
	public void addTest(ExamTestVO examTestVO) {
		ExamTest examTest = new ExamTest();
		ExamTestType examTestType = iExamTestTypeDAO.get(examTestVO.getExamTestTypeVO().getId());
		examTest.setExamTestType(examTestType);
		BeanUtils.copyProperties(examTestVO, examTest);
		iExamTestDAO.save(examTest);
	}

}
